{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# SVM——皮马印第安人糖尿病分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "#from sklearn.metrics import log_loss  \n",
    "#SVM并不能直接输出各类的概率，所以用正确率作为模型预测性能的度量\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 读取数据 & 数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath +\"diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Outcome 分布，看看两类样本分布是否均衡\n",
    "sns.countplot(train.Outcome);\n",
    "pyplot.xlabel('Outcome');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 从数据中分离输入特征X_train和输出y_train\n",
    "y_train = train['Outcome']\n",
    "X_train = train.drop('Outcome', axis = 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 对训练数据的特征进行标准化处理\n",
    "X_train = ss_X.fit_transform(X_train)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/zcz/.local/lib/python3.6/site-packages/sklearn/model_selection/_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 用train_test_split估计模型性能\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_val, y_train_part, y_val = train_test_split(X_train, y_train, train_size = 0.8,random_state = 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# default SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import LinearSVC\n",
    "\n",
    "SVC1 = LinearSVC().fit(X_train_part, y_train_part)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.84      0.92      0.88       107\n",
      "          1       0.76      0.62      0.68        47\n",
      "\n",
      "avg / total       0.82      0.82      0.82       154\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[98  9]\n",
      " [18 29]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "#在校验集上测试，估计模型性能\n",
    "y_predict = SVC1.predict(X_val)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (SVC1, classification_report(y_val, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % confusion_matrix(y_val, y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线性SVM正则参数调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fit_grid_point_Linear(C, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集利用SVC训练\n",
    "    SVC2 =  LinearSVC( C = C)\n",
    "    SVC2 = SVC2.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC2.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No handles with labels found to put in legend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.8246753246753247\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.8246753246753247\n",
      "accuracy: 0.7597402597402597\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-2.5, 2, 7)\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    tmp = fit_grid_point_Linear(oneC, X_train, y_train, X_val, y_val)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "\n",
    "pyplot.show()\n",
    "  \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "比Logistic回归要好一些，可以再用RBF核的SVM是试试"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RBF核SVM正则参数调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.8181818181818182\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.8376623376623377\n",
      "accuracy: 0.9155844155844156\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.8701298701298701\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.8246753246753247\n",
      "accuracy: 0.9155844155844156\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.8116883116883117\n",
      "accuracy: 0.9285714285714286\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-2.5, 2, 7)\n",
    "gamma_s = np.logspace(-2, 4, 7)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_val, y_val)\n",
    "        accuracy_s.append(tmp)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
